iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 11
1

介紹

參數(Parameter) 被呼叫端用來接收引數的「變數」。
引數(Argument) 引數是呼叫端傳給呼叫對象的「值」,稱為引數。

引數預設值

首先,我們先來設定預設引數的預設值,設定得方法很簡單,只要在定義方法後面寫像是 (x=1, y=2, z=3) 這樣就設定完成。

def arg(x=1,y=2,z=3)
  "(#{x},#{y},#{z})"
end

puts arg		#=> (1,2,3)

再來看看在呼叫方法時,來觀察歸他的規則

def arg(x=1, y=2, z=3)
  "( #{x}, #{y}, #{z} )"
end

puts arg(11)				# => ( 11, 2, 3 )
puts arg(11, 22)			# => ( 11, 22, 3 )			
puts arg(11, 22, 33)		# => ( 11, 22, 33 )

—-

def arg(a, b=1, c=2, d, e)
  "( #{a}, #{b}, #{c}, #{d}, #{e} )"
end

puts arg(11, 22)            	# => ArgumentError
puts arg(11, 22, 33)			# => ( 11, 1, 2, 22, 33 )
puts arg(11, 22, 33, 44)		# => ( 11, 22, 2, 33, 44 )
puts arg(11, 22, 33, 44, 55)	# => ( 11, 22, 33, 44, 55 )

第一段程式很清楚,就是給多少就帶多少值
第二段複雜一點點,但也是可以觀察出他的有規則,如果給的引數跟預期數量不一樣的時候,基本上會先依序填補沒有給預設值的位置。
當所的引數比預期多一點的時候,先以程式碼為例,似乎會先從左右判斷先將11,33,44填入,最後再將已有預設值得地方由左至右22填上。
以上是我觀察出來得結果,如果不懂也許可以再多試其他組合,就能更清楚了

注意

喔!對了~這裡要補充一下給引數預設值的規則,當 arg(a=1, b, c=2) 這樣的預設值設定是分開狀況下,執行會出現syntax error

def arg(a=1, b, c=2)
    “(#{a}, #{b}, #{c})”
end

puts arg	# => syntax error

要改成def arg(a=1, b=2, c)def arg(a, b=3, c=5)預設值設定是相鄰的情況下,才能正常運作

符號*

有時候我們會再看到*arr前綴一個*的符號的寫法,執行後會得到一個[]空陣列。

def arg(a=1, *arr, c)
  "( #{a}, #{arr}, #{c} )"
end

puts arg(22)	# => ( 1, [], 22 )

我們可以拿剛剛的例子來玩玩看,在d的前面加上*符號

def arg(a, b=1, c=2, *d, e)
  "( #{a}, #{b}, #{c}, #{d}, #{e} )"
end

puts arg(11, 22)				
puts arg(11, 22, 33)				
puts arg(11, 22, 33, 44)			
puts arg(11, 22, 33, 44, 55)		
puts arg(11, 22, 33, 44, 55, 66)	

# => ( 11, 1, 2, [], 22 )
# => ( 11, 22, 2, [], 33 )
# => ( 11, 22, 33, [], 44 )
# => ( 11, 22, 33, [44], 55 )
# => ( 11, 22, 33, [44, 55], 66 )

除了沒有值得情況下*d會傳出一個[]空陣列
而後面的結果將引數帶入,傳出來也會得到陣列

換成字串

def hello(place,*animal)
  "這裡是#{place},裡面有#{animal}"
end

puts hello("Zoo","cat","dog","monkey","pig")
# => 這裡是Zoo,裡面有["cat", "dog", "monkey", "pig"]

參考連結:
Ruby女孩


上一篇
Day10 | Proc vs Lambda
下一篇
Day12 | Array 陣列
系列文
從色彩繽紛到只看亂碼日子,學程式從 Ruby 出發!30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言